/**
 * 表单验证工具
 */
const Validator = (function() {
    /**
     * 验证用户名
     * @param {string} username - 用户名
     * @returns {string} 错误消息，如果验证通过则返回空字符串
     */
    function validateUsername(username) {
        if (!username) {
            return '请输入用户名';
        }
        
        if (username.length < 3) {
            return '用户名长度不能少于3个字符';
        }
        
        if (username.length > 50) {
            return '用户名长度不能超过50个字符';
        }
        
        // 用户名只能包含字母、数字、下划线和中文
        if (!/^[a-zA-Z0-9_\u4e00-\u9fa5]+$/.test(username)) {
            return '用户名只能包含字母、数字、下划线和中文';
        }
        
        return '';
    }
    
    /**
     * 验证密码
     * @param {string} password - 密码
     * @returns {string} 错误消息，如果验证通过则返回空字符串
     */
    function validatePassword(password) {
        if (!password) {
            return '请输入密码';
        }
        
        if (password.length < 6) {
            return '密码长度不能少于6个字符';
        }
        
        if (password.length > 100) {
            return '密码长度不能超过100个字符';
        }
        
        // 强密码验证（至少包含一个大写字母、一个小写字母和一个数字）
        if (!/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{6,}$/.test(password)) {
            return '密码必须包含至少一个大写字母、一个小写字母和一个数字';
        }
        
        return '';
    }
    
    /**
     * 验证两次密码是否一致
     * @param {string} password - 密码
     * @param {string} confirmPassword - 确认密码
     * @returns {string} 错误消息，如果验证通过则返回空字符串
     */
    function validateConfirmPassword(password, confirmPassword) {
        if (!confirmPassword) {
            return '请确认密码';
        }
        
        if (password !== confirmPassword) {
            return '两次输入的密码不一致';
        }
        
        return '';
    }
    
    /**
     * 验证电子邮箱
     * @param {string} email - 电子邮箱
     * @returns {string} 错误消息，如果验证通过则返回空字符串
     */
    function validateEmail(email) {
        if (!email) {
            return '';  // 电子邮箱可以为空
        }
        
        // 简单的电子邮箱格式验证
        if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
            return '请输入有效的电子邮箱地址';
        }
        
        return '';
    }
    
    /**
     * 验证手机号码
     * @param {string} phoneNumber - 手机号码
     * @returns {string} 错误消息，如果验证通过则返回空字符串
     */
    function validatePhoneNumber(phoneNumber) {
        if (!phoneNumber) {
            return '';  // 手机号码可以为空
        }
        
        // 中国大陆手机号码格式验证
        if (!/^1[3-9]\d{9}$/.test(phoneNumber)) {
            return '请输入有效的手机号码';
        }
        
        return '';
    }
    
    /**
     * 验证真实姓名
     * @param {string} realName - 真实姓名
     * @returns {string} 错误消息，如果验证通过则返回空字符串
     */
    function validateRealName(realName) {
        if (!realName) {
            return '';  // 真实姓名可以为空
        }
        
        if (realName.length > 50) {
            return '姓名长度不能超过50个字符';
        }
        
        return '';
    }
    
    /**
     * 验证表单字段
     * @param {HTMLElement} inputElement - 输入元素
     * @param {HTMLElement} errorElement - 错误提示元素
     * @param {Function} validationFunction - 验证函数
     * @returns {boolean} 是否验证通过
     */
    function validateField(inputElement, errorElement, validationFunction) {
        const value = inputElement.value.trim();
        const errorMessage = validationFunction(value);
        
        if (errorMessage) {
            inputElement.classList.add('is-invalid');
            inputElement.classList.remove('is-valid');
            errorElement.textContent = errorMessage;
            return false;
        } else {
            inputElement.classList.remove('is-invalid');
            inputElement.classList.add('is-valid');
            errorElement.textContent = '';
            return true;
        }
    }
    
    /**
     * 验证整个表单
     * @param {HTMLFormElement} form - 表单元素
     * @returns {boolean} 是否验证通过
     */
    function validateForm(form) {
        let isValid = true;
        
        // 获取表单中的所有输入元素
        const inputs = form.querySelectorAll('input, select, textarea');
        
        // 遍历输入元素，根据类型进行验证
        inputs.forEach(input => {
            if (input.type === 'submit' || input.type === 'button' || input.type === 'reset') {
                return;  // 跳过按钮类型
            }
            
            const errorElement = document.getElementById(`${input.id}-error`);
            if (!errorElement) {
                return;  // 如果没有对应的错误元素，跳过
            }
            
            let valid = true;
            
            // 根据输入类型或名称选择验证函数
            if (input.name === 'username' || input.id === 'username') {
                valid = validateField(input, errorElement, validateUsername);
            } else if (input.name === 'password' || input.id === 'password') {
                valid = validateField(input, errorElement, validatePassword);
            } else if (input.name === 'confirmPassword' || input.id === 'confirmPassword') {
                const passwordInput = form.querySelector('input[name="password"]') || form.querySelector('#password');
                valid = validateField(input, errorElement, value => validateConfirmPassword(passwordInput.value, value));
            } else if (input.name === 'email' || input.id === 'email' || input.type === 'email') {
                valid = validateField(input, errorElement, validateEmail);
            } else if (input.name === 'phoneNumber' || input.id === 'phoneNumber') {
                valid = validateField(input, errorElement, validatePhoneNumber);
            } else if (input.name === 'realName' || input.id === 'realName') {
                valid = validateField(input, errorElement, validateRealName);
            } else if (input.required) {
                // 对于其他必填字段，进行简单的非空验证
                valid = validateField(input, errorElement, value => value ? '' : '此字段不能为空');
            }
            
            if (!valid) {
                isValid = false;
            }
        });
        
        return isValid;
    }
    
    // 暴露公共方法
    return {
        validateUsername,
        validatePassword,
        validateConfirmPassword,
        validateEmail,
        validatePhoneNumber,
        validateRealName,
        validateField,
        validateForm
    };
})(); 